package socket;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;
import java.nio.charset.StandardCharsets;

/**
 * 聊天室服务端
 */
public class Server_V2 {
    /*
        java.net.ServerSocket
        运行在服务端的ServerSocket主要负责两个工作:
        1:申请服务端口，客户端通过该端口与服务端建立链接
        2:监听服务端口，一旦一个客户端链接便创建一个Socket与该客户端交互

        ServerSocket相当于是某客服的"总机"
     */
    private ServerSocket serverSocket;

    public Server_V2(){
        try {
            System.out.println("正在启动服务端...");
            /*
                java.net.BindException: address already in use
                原因:服务端申请的端口被系统其它程序占用了。
                解决办法:
                1:后期遇到该问题通常是重复启动了两次服务端导致的，需要杀死之前启动的
                  服务端进程
                2:更换端口号
             */
            serverSocket = new ServerSocket(8088);
            System.out.println("服务端启动完毕!");
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    public void start(){
        try {
            while(true) {
                System.out.println("等待客户端链接...");
                Socket socket = serverSocket.accept();
                System.out.println("一个客户端链接了!");
                //启动一个线程来处理与该客户端的交互
                Runnable handler = new ClientHandler(socket);
                Thread t = new Thread(handler);
                t.start();

            }

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        Server_V2 server = new Server_V2();
        server.start();
    }

    /**
     * 该线程任务是负责与指定的客户端进行交互
     */
    private class ClientHandler implements Runnable{
        private Socket socket;
        private String host;//记录远端计算机地址信息

        public ClientHandler(Socket socket){
            this.socket = socket;
            //通过socket获取远端计算机地址信息
            host = socket.getInetAddress().getHostAddress();
        }

        public void run(){
            try {
                InputStream in = socket.getInputStream();
                InputStreamReader isr = new InputStreamReader(in, StandardCharsets.UTF_8);
                BufferedReader br = new BufferedReader(isr);
                String line;
                while((line = br.readLine())!=null) {
                    System.out.println(host+"说:" + line);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }


}







